package com.hippo.javacore.javaiostream.iostream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @ClassName FileInputStreamOpt
 * @Description TODO 文件字节输入流操作
 * @Author tangxl
 * @create 2023-04-06 14:40
 **/
public class FileInputStreamOpt {
    public static void main(String[] args) throws IOException {
        // TODO 文件输入流操作
        // 1.文件字节输入流：每次读取一个字节
        // 2.文件字节输入流：每次读取多个字节
        // 3.文件字节输入流：一次性读取所有字节

        // 1.文件字节输入流：每次读取一个字节
        // 1.1 创建文件字节输入流对象
        InputStream in1 = new FileInputStream("study-commons/java-file-iostream/src/main/resources/file/a.txt");
        // 1.1 每次读取一个字节
        int b11 = in1.read();
        System.out.println("b1="+(char)b11);
        int b12 = in1.read();
        System.out.println("b2="+(char)b12);
        int b13 = in1.read();
        System.out.println("b3="+(char)b13);

        // 1.2 循环读取单个字节
        int b1;
        while ((b1 = in1.read()) != -1) {
            System.out.println("b1="+(char)b1);
        }

        // 1.3 关闭资源
        in1.close();

        //每次读取一个字节，读取数据性能慢
        // 读取汉字（两个字节）会乱码!!!

        // 2.文件字节输入流：每次读取多个字节
        // 2.1 创建文件字节输入流对象
        InputStream in2 = new FileInputStream("study-commons/java-file-iostream/src/main/resources/file/a.txt");
        byte[] bytes1 = new byte[3]; // 每次读取3个字节
        int lenth1 = in2.read(bytes1);
        System.out.println("lenth1="+lenth1);
        System.out.println("bytes1="+new String(bytes1, 0, lenth1, "UTF-8"));

        // 2.2 循环读取多个字节
        int lenth2; // 每次读取的字节数
        byte[] bytes2 = new byte[3]; // 每次读取3个字节
        while ((lenth2 = in2.read(bytes2)) != -1) { // 每次读取3个字节,返回读取的字节数,当读取到文件末尾时，返回-1
            System.out.println("lenth2="+lenth2);
            System.out.println("bytes2="+new String(bytes2, 0, lenth2, "UTF-8"));
        }
        // 3.关闭资源
        in2.close();

        //性能得到了明显的提升!!
        //这种方案也不能避免读取汉字输出乱码的问题!!

        // 3.文件字节输入流：一次性读取所有字节
        // 3.1 创建文件字节输入流对象
        InputStream in3 = new FileInputStream("study-commons/java-file-iostream/src/main/resources/file/a.txt");
        // 3.2 一次性读取所有字节
//        int available = in3.available();// 获取文件字节输入流的可用字节数
//        byte[] bytes3 = new byte[available]; // 创建一个字节数组，长度为文件字节输入流的可用字节数
//        int lenth3 = in3.read(bytes3);
//        System.out.println("lenth3="+lenth3);
//        System.out.println("bytes3="+new String(bytes3, 0, lenth3, "UTF-8"));

//        byte[] bytes3 = in3.readAllBytes(); // JDK9新增的方法，一次性读取所有字节
//        System.out.println("bytes3="+new String(bytes3, "UTF-8"));
        // 3.3 关闭资源
        in3.close();

        // 一次性读取所有字节，性能最好!!
        // 但是，如果文件过大，会导致内存溢出!!

    }
}
